<?php
/**
 * 验证类
 * 
 * ============================================================================
 * 版权所有 (c) 2001-2009，南宁市孟捷网络科技有限责公司，并保留所有权利。
 * 这不是一个自由软件！您只能在不用于商业目的的前提下对程序代码进行修改和使用；
 * 不允许对程序代码以任何形式任何目的的再发布。
 * ============================================================================
 *
 * @author      cmpan
 * @copyright   Copyright (c) 2009-2010 MJieNET Inc. (http://www.mjie.net)
 * @license     http://www.mjie.net/license/1_0.txt
 */

class UE_Validate_Exception extends UE_Exception{}
 
class UE_Validate extends UE_Object {

	protected $_errs = array();

	/**
	 * UE_Validate::check(待验证变量1, array('type1'=>'errorMsg', 'type2'=>'errorMsg'[,...]));
	 *
	 */
	public function check($var, $sets = array()) {
		foreach($sets as $vType => $vMsg) {
			// 如果验证方法不存在
			if(! method_exists(__CLASS__, $vType)) {
				throw new UE_Validate_Exception (__CLASS__ . "::$vType() dose not exists!");
			}
			if(! $this->$vType($var)) {
				$this->_errs[] = $vMsg;
			}
		}
		return $this;
	}

	/**
	 * 参数格式是否email格式
	 *
	 * @param string $email
	 * @return bool
	 */
	public static function isEmail($email) {
		if(strpos($email, "@") !== false && strpos($email, ".") !== false) {
			if(preg_match("/^([a-z0-9+_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,5}\$/i", $email)) {
				return true;
			}
		}
		
		return false;
	}

	/**
	 * 参数格式是否是时间的格式
	 *
	 * @param string $var
	 * @return bool
	 */
	public static function isTime($time) {
		return preg_match("/[\\d]{4}-[\\d]{1,2}-[\\d]{1,2}\\s[\\d]{1,2}:[\\d]{1,2}:[\\d]{1,2}/", $time);
	}

	/**
	 * 参数是否已经初始化
	 *
	 * @param string $var
	 * @return bool
	 */
	public static function isInit(&$var) {
		if(! isset($var)) {
			return false;
		}
		return true;
	}

	/**
	 * 参数是否为空
	 *
	 * @param string $var
	 * @return bool
	 */
	public static function isEmpty($var) {
		if(empty($var) && 0 == strlen($var)) {
			return false;
		}
		return true;
	}

	/**
	 * 参数是否是只允许字母、数字和下划线的字符串
	 *
	 * @param string $var
	 * @return bool
	 */
	public static function isSafeString(&$var) {
		if(! preg_match('/^[0-9a-zA-Z_]*$/', $var)) {
			return false;
		}
		return true;
	}

	/**
	 * 参数类型是否是货币的格式 123.45,保留2位小数
	 *
	 * @param string|float $var
	 * @return bool
	 */
	public static function isMoney($var) {
		if(! preg_match('/^[0-9]*\.[0-9]{2}$/', $var)) {
			return false;
		}
		return true;
	}

	/**
	 * 参数类型是否为IP
	 *
	 * @param string $var
	 * @return bool
	 */
	public static function isIP($var) {
		$var = (string)$var;
		if(! ip2long($var)) {
			return false;
		}
		return true;
	}

	public static function isUrl($str) {
		if(preg_match("/^http:\/\/(([a-z0-9_]|\\-)+\\.)+[a-z]{2,5}(\/\w)?/i", $str)) {
			return true;
		}
		return false;		
	}

	/**
	 * 参数类型是否为数字型
	 *
	 * @param string $var
	 * @return bool
	 */
	public static function isNumber($var) {
		if(! is_numeric($var)) {
			return false;
		}
		return true;
	}

	/**
	 * 参数类型是否为年的格式(1000-2999)
	 *
	 * @param int|string $var
	 * @return bool
	 */
	public static function isYear($var) {
		if(! preg_match('/^[12][0-9]{3}$/', $var)) {
			return false;
		}
		return true;
	}

	/**
	 * 参数类型是否为月格式
	 *
	 * @param int|string $var
	 * @return bool
	 */
	public static function isMonth($var) {
		if((! preg_match('/^[0-9]*$/', $var)) || 0 == $var || 12 < $var || strlen($var) > 2) {
			return false;
		}
		return true;
	}

	/**
	 * 参数类型是否为日期的日格式
	 *
	 * @param int|string $var
	 * @return bool
	 */
	public static function isDay($var) {
		if((! preg_match('/^[0-9]*$/', $var)) || 0 == $var || 31 < $var || strlen($var) > 2) {
			return false;
		}
		return true;
	}

	/**
	 * 参数类型是否为时间的小时格式
	 *
	 * @param int|string $var
	 * @return bool
	 */
	public static function isHour($var) {
		if((! preg_match('/^[0-9]*$/', $var)) || 23 < $var || strlen($var) > 2) {
			return false;
		}
		return true;
	}

	/**
	 * 参数类型是否为时间的分钟格式
	 *
	 * @param int|string $var
	 * @return bool
	 */
	public static function isMinute($var) {
		if((! preg_match('/^[0-9]*$/', $var)) || 60 < $var || strlen($var) > 2) {
			return false;
		}
		return true;
	}

	/**
	 * 参数类型是否为时间的秒钟格式
	 *
	 * @param int|string $var
	 * @return bool
	 */
	public static function isSecond($var) {
		self::isMinute($var);
	}

	/**
	 * 参数类型是否为星期范围内的值
	 *
	 * @param int|string $var
	 * @return bool
	 */
	public static function isWeek($var) {
		$weeks = array(1, 2, 3, 4, 5, 6, 7, '一', '二', '三', '四', '五', '六', '天', '日', 'monday', 
				'tuesday', 'wednesday', 'thursday', 'Friday', 'saturday', 'sunday', 'mon', 'tue', 
				'wed', 'thu', 'fri', 'sat', 'sun');
		$var = strtolower($var);
		if(! in_array($var, $weeks)) {
			return false;
		}
		return true;
	}

	/**
	 * 参数类型是否为十六进制字符串
	 *
	 * @param int|string $var
	 * @return bool
	 */
	public static function isHex($var) {
		if(! preg_match('/^[0-9A-Fa-f]*$/', $var)) {
			return false;
		}
		return true;
	}

	/**
	 * 身份证号码
	 * 可以验证15和18位的身份证号码
	 *
	 * @param string $str
	 * @return bool
	 */
	public static function isIdCard($var) {
		$province = array("11", "12", "13", "14", "15", "21", "22", "23", "31", "32", "33", "34", 
				"35", "36", "37", "41", "42", "43", "44", "45", "46", "50", "51", "52", "53", 
				"54", "61", "62", "63", "64", "65", "71", "81", "82", "91");
		//前两位的省级代码
		if(! in_array(substr($var, 0, 2), $province)) {
			return false;
		}
		if(strlen($var) == 15) {
			if(! preg_match("/^\d+$/", $var)) return false;
			// 检查年-月-日（年前面加19）
			return checkdate(substr($var, 8, 2), substr($var, 10, 2), 
					"19" . substr($var, 6, 2));
		}
		if(strlen($var) == 18) {
			if(! preg_match("/^\d+$/", substr($var, 0, 17))) {
				return false; // 前17位是否是数字
			}
			//检查年-月-日
			if(! @checkdate(substr($var, 10, 2), substr($var, 12, 2), 
					substr($var, 6, 4))) {
				return false;
			}
			//加权因子Wi=2^（i-1）(mod 11)计算得出
			$Wi_arr = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1);
			//校验码对应值
			$VN_arr = array(1, 0, 'x', 9, 8, 7, 6, 5, 4, 3, 2);
			//计算校验码总值(计算前17位的，最后一位为校验码)
			for($i = 0; $i < strlen($var) - 1; $i++) {
				$t += substr($var, $i, 1) * $Wi_arr[$i];
			}
			//得到校验码
			$VN = $VN_arr[($t % 11)];
			//判断最后一位的校验码
			if($VN == substr($var, - 1)) {
				return true;
			} else {
				return false;
			}
		}
		return false;
	}

	/**
	 * 验证字符串是否是utf-8
	 *
	 * @param string $text
	 * @return bool
	 */
	public static function isUtf8($text) {
		if(strlen($text) == 0) {
			return true;
		}
		return (preg_match('/^./us', $text) == 1);
	}
}
